/**
 * 数据验证工具函数
 */

// 导出统一的对象，避免命名冲突
export const validUtil = {
  /**
   * 判断是否为空值（null、undefined、空字符串、空数组、空对象）
   * @param value 待检测的值
   * @returns 是否为空
   */
  isEmpty(value: unknown): boolean {
    if (value === null || value === undefined) return true;
    if (typeof value === 'string' && value.trim() === '') return true;
    if (Array.isArray(value) && value.length === 0) return true;
    if (typeof value === 'object' && Object.keys(value as object).length === 0) return true;
    return false;
  },

  /**
   * 验证邮箱格式
   * @param email 邮箱字符串
   * @returns 是否为有效邮箱
   */
  isValidEmail(email: string): boolean {
    if (!email) return false;
    const pattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    return pattern.test(email);
  },

  /**
   * 验证手机号格式（中国大陆）
   * @param mobile 手机号字符串
   * @returns 是否为有效手机号
   */
  isValidMobile(mobile: string): boolean {
    if (!mobile) return false;
    const pattern = /^1[3-9]\d{9}$/;
    return pattern.test(mobile);
  },

  /**
   * 验证URL格式
   * @param url URL字符串
   * @returns 是否为有效URL
   */
  isValidUrl(url: string): boolean {
    if (!url) return false;
    try {
      new URL(url);
      return true;
    } catch (err) {
      return false;
    }
  },

  /**
   * 验证身份证号（中国大陆18位）
   * @param idCard 身份证号
   * @returns 是否为有效身份证号
   */
  isValidIDCard(idCard: string): boolean {
    if (!idCard || idCard.length !== 18) return false;
    
    // 基本格式校验
    const pattern = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$/;
    if (!pattern.test(idCard)) return false;
    
    // 校验日期部分
    const year = parseInt(idCard.substring(6, 10));
    const month = parseInt(idCard.substring(10, 12));
    const day = parseInt(idCard.substring(12, 14));
    
    const date = new Date(year, month - 1, day);
    if (
      date.getFullYear() !== year ||
      date.getMonth() + 1 !== month ||
      date.getDate() !== day
    ) {
      return false;
    }
    
    // 校验校验码
    const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    const tokens = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
    
    let sum = 0;
    for (let i = 0; i < 17; i++) {
      sum += parseInt(idCard.charAt(i)) * factors[i];
    }
    
    const checkDigit = tokens[sum % 11];
    return checkDigit === idCard.charAt(17);
  }
}; 